home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge02.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  4KB  |  203 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef    DDEQUAL
  23. int             ddequal(A, B)         /* lifted equal */
  24. register AFFIX A, B;
  25. {
  26.   register char  *xs = c, *ys;
  27.   if (A == B)
  28.     return true;
  29.   else if (((A->r) == nil) && ((A->l) == nil))
  30.     xs = (A->t);
  31.   else {
  32.     sprinta(A);
  33.     *c++ = '\0';
  34.   }
  35.   ys = c;
  36.   if (((B->r) == nil) && ((B->l) == nil))
  37.     ys = B->t;
  38.   else {
  39.     sprinta(B);
  40.     *c++ = '\0';
  41.   }
  42.   if (afxcmp(xs, ys) == 0)
  43.     return true;
  44.   return false;
  45. }
  46. #endif
  47.  
  48. #ifdef         DEQUAL
  49. int             dequal(A, B)         /* lifted not equal */
  50. register AFFIX A, B;
  51. {
  52.   register char *rc = c;
  53.    if  (ddequal(A,B)) {
  54.        c = rc;
  55.   if (rc > cstore_top ) cstore_overflow();
  56.        return true;
  57.    }
  58.    return false;
  59.         
  60.     
  61. }
  62. #endif
  63.  
  64. #ifdef DNOTEQUAL
  65. int             dnotequal(A, B)         /* lifted not equal */
  66. register AFFIX A, B;
  67. {
  68.   return !dequal(A,B);
  69. }
  70. #endif
  71.  
  72. #ifdef DDFQUAL
  73. int             ddfqual(A, B)         /* lifted equal */
  74. register AFFIX A, B;
  75. {
  76.   register char  *xs = c, *ys;
  77.   if (A == B)
  78.     return true;
  79.   else if ((A >= first_meta) && (B >= first_meta)  &&
  80.           (A <= last_meta) && (B <= last_meta) )  {
  81.     return false;
  82.   }
  83.   else if (((A->r) == nil) && ((A->l) == nil))
  84.     xs = (A->t);
  85.   else {
  86.     sprinta(A);
  87.     *c++ = '\0';
  88.   }
  89.   ys = c;
  90.   if (((B->r) == nil) && ((B->l) == nil))
  91.     ys = B->t;
  92.   else {
  93.     sprinta(B);
  94.     *c++ = '\0';
  95.   }
  96.   if (afxcmp(xs, ys) == 0)
  97.     return true;
  98.   return false;
  99. }
  100. #endif
  101.  
  102. #ifdef   DFQUAL
  103. int             dfqual(A, B)         /* lifted not equal */
  104. register AFFIX A, B;
  105. {
  106.   register char *rc = c;
  107.    if  (ddfqual(A,B)) {
  108.        c = rc;
  109.   if (rc > cstore_top ) cstore_overflow();
  110.        return true;
  111.    }
  112.    return false;
  113.         
  114.     
  115. }
  116. #endif
  117.  
  118. #ifdef DFOTEQUAL
  119. int             dfotequal(A, B)         /* lifted not equal */
  120. register AFFIX A, B;
  121. {
  122.   return !dfqual(A,B);
  123. }
  124. #endif
  125.  
  126. #ifdef DCOMPARE
  127. int dcompare(A,B,tailx,taily)              /* compare */
  128. register AFFIX A, B,tailx,taily;
  129. {
  130.     register char  *xs = c, *ys;
  131.     if ((A -> r == nil) && (A -> l == nil))
  132.       xs = A -> t;
  133.     else {
  134.       sprinta(A);
  135.       *c++ = '\0';
  136.     }
  137.     ys = c;
  138.     if ((B -> r == nil) && (B -> l == nil))
  139.       ys = B -> t;
  140.     else {
  141.       sprinta(B);
  142.       *c++ = '\0';
  143.     }
  144.     while ((*xs == *ys++))
  145.       if (*xs++ == '\0') {
  146.         ASSIGN(tailx, empty, nil, nil);
  147.         ASSIGN(taily, empty, nil, nil);
  148.         return true;
  149.       }
  150.     ASSIGN(tailx, xs, nil, nil);
  151.     ASSIGN(taily, --ys, nil, nil);
  152.   return true;
  153. }
  154. #endif
  155.  
  156. #ifdef ULINENUM
  157. void ulinenum() {
  158.   affix   *D_0 = (q--)->a;
  159.   register char  *rip = set_line_pos;
  160.   int             line = set_line_num;
  161.   int             save_l = line;
  162.   char             *save_p = rip;
  163.   D_0->t = c;
  164.   D_0->l = nil;
  165.   D_0->r = nil;
  166.   while (rip < ip)
  167.     if (*rip++ == '\n')
  168.       line += 1;
  169.   (void)  sprintf(c, "%d\0", line);
  170.   set_line_pos = ip;
  171.   set_line_num = line;
  172.   c += 8;
  173.   q -= 1;
  174.   (*(*(q + 1)).q) ();
  175.   c -= 8;
  176.   set_line_pos = save_p;
  177.   set_line_num = save_l;
  178.   (++q)->a = D_0;
  179.   (++q)->q = ulinenum;
  180. }
  181. #endif
  182.  
  183. #ifdef DLINENUM
  184. int dlinenum(D_0)
  185. register affix   *D_0;
  186. {
  187.   register char  *rip = set_line_pos;
  188.   int             line = set_line_num;
  189.   D_0->t = c;
  190.   D_0->l = nil;
  191.   D_0->r = nil;
  192.   while (rip < ip)
  193.     if (*rip++ == '\n')
  194.       line += 1;
  195.   (void)  sprintf(c, "%d\0", line);
  196.   set_line_pos = ip;
  197.   set_line_num = line;
  198.   c += 8;
  199.   return true;
  200. }
  201. #endif
  202.  
  203.